use std::fmt::Display;

// 泛型结构体：星际集装箱
struct CargoContainer<T: Display> {
    id: u32,
    contents: T,
    owner: &'static str
}

// 泛型方法实现
impl<T: Display> CargoContainer<T> {
    fn inspect(&self) {
        println!(
            "货柜#{}-所有人:{} | 内容物:{}", 
            self.id, 
            self.owner,
            self.contents
        );
    }
}

// 特质定义
trait HazardCheck {
    fn safety_check(&self);
}

// 为所有可显示类型实现安全检查
impl<T: Display> HazardCheck for CargoContainer<T> {
    fn safety_check(&self) {
        if self.id % 2 == 0 {
            println!("✅ 货柜#{} 通过安检", self.id);
        } else {
            println!("⚠️ 货柜#{} 需要人工复查", self.id);
        }
    }
}

fn main() {
    // 实例化各种货柜
    let container1 = CargoContainer { 
        id: 1024, 
        contents: "反物质燃料", 
        owner: "星际能源公司" 
    };
    
    let container2 = CargoContainer {
        id: 2048,
        contents: 42.7,  // 泛型支持浮点数
        owner: "宇宙物流"
    };

    // 调用泛型方法
    container1.inspect();
    container2.inspect();

    // 执行特质方法
    container1.safety_check();
    container2.safety_check();
}
